/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import static DAO.AbstractDAO.fermeturesSilencieuses;
import static DAO.AbstractDAO.initialisationRequetePreparee;
import Modele.Station;
import Utils.Constantes;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author 20cent
 */
public class StationDAOmysql extends AbstractDAO implements StationDao {
    
    private static final String SQL_INSERT = "INSERT INTO `nemo_velo`.`" + ChampsBDD.TABLE_STATION + "` (`"
            + ChampsBDD.STATION_ID + "`, `"
            + ChampsBDD.STATION_CAPACITE + "`, `"
            + ChampsBDD.STATION_COORD
            + "`) VALUES (NULL, ?, ?);";
    private static final String SQL_UPDATE = "UPDATE `nemo_velo`.`" + ChampsBDD.TABLE_STATION + "` SET `"
            + ChampsBDD.STATION_CAPACITE + "` = ?, `"
            + ChampsBDD.STATION_COORD + "` = ? `"
            + "WHERE `" + ChampsBDD.STATION_ID + "` = ?;";
    private static final String SQL_DELETE = "DELETE FROM `nemo_velo`.`" + ChampsBDD.TABLE_STATION + "` "
            + "WHERE `" + ChampsBDD.STATION_ID + "` = ?;";
    private static final String SQL_SELECT_PAR_ID = "SELECT * "
            + "FROM  `" + ChampsBDD.TABLE_STATION + "` "
            + "WHERE  `" + ChampsBDD.STATION_ID + "` = ?";
    private static final String SQL_SELECT_ALL = "SELECT * "
            + "FROM  `" + ChampsBDD.TABLE_STATION + "` "
            + "LIMIT ?, "+ Constantes.LIGNE_PAR_PAGE+";";

    public StationDAOmysql(DAOFactory daoFactory) {
        super(daoFactory);
    }

    @Override
    public void save(Station station) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_INSERT, true, station.getMCapacite(), station.getMCoordonees());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if (statut == 0) {
                throw new DAOException("Échec de la création de la station, aucune ligne ajoutée dans la table.");
            }
            /* Récupération de l'id auto-généré par la requête d'insertion */
            valeursAutoGenerees = preparedStatement.getGeneratedKeys();
            if (valeursAutoGenerees.next()) {
                /* Puis initialisation de la propriété id du bean Utilisateur avec sa valeur */
                station.setMId(valeursAutoGenerees.getInt(1));
            } else {
                throw new DAOException("Échec de la création de la station en base, aucun ID auto-généré retourné.");
            }
        } catch (SQLException e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(valeursAutoGenerees, preparedStatement, connexion);
        }
    }

    @Override
    public void update(Station station) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_UPDATE, false, station.getMCapacite(), station.getMCoordonees(), station.getMId());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if (statut == 0) {
                throw new DAOException("Échec de la création de la station, aucune ligne modifiée dans la table.");
            }

        } catch (SQLException e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(preparedStatement, connexion);
        }
    }

    @Override
    public void delete(Station station) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_DELETE, false, station.getMId());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if (statut == 0) {
                throw new DAOException("Échec de la suppression de la Station, aucune ligne supprimée dans la table.");
            }

        } catch (SQLException e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(preparedStatement, connexion);
        }
    }

    @Override
    public Station getByID(int id) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Station station = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_SELECT_PAR_ID, false, id);
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données de l'éventuel ResulSet retourné */
            if (resultSet.next()) {
                station = map(resultSet);
            }
        } catch (Exception e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(resultSet, preparedStatement, connexion);
        }
        return station;
    }

    @Override
    public ArrayList<Station> getAll(int page) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ArrayList<Station> liste = new ArrayList<>();

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee(connexion, SQL_SELECT_ALL, false, (page-1)*Constantes.LIGNE_PAR_PAGE);
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données de l'éventuel ResulSet retourné */
            while (resultSet.next()) {
                liste.add(map(resultSet));
            }
        } catch (Exception e) {
            throw new DAOException(e);
        } finally {
            fermeturesSilencieuses(resultSet, preparedStatement, connexion);
        }
        return liste;
    }
    
    /*
     * Simple méthode utilitaire permettant de faire la correspondance (le
     * mapping) entre une ligne issue de la table des utilisateurs (un
     * ResultSet) et un bean Utilisateur.
     */
    private static Station map(ResultSet resultSet) throws SQLException {
        Station station = new Station();
        
        station.setMId(resultSet.getInt(ChampsBDD.STATION_ID));
        station.setMCapacite(resultSet.getInt(ChampsBDD.STATION_CAPACITE));
        station.setMCoordonees(resultSet.getString(ChampsBDD.STATION_COORD));

        return station;
    }
}
